/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


/**
 *
 * @author Christopher
 */

public class Atoms{
    private boolean tipoNumero;     // es un numero?
    private boolean tipoCadena;     // es una lista?
    private boolean tipoNulo;       // es tipo null?
    private boolean tipoVariable;   // es una variable?
    private boolean tipoFuncion;    // es una funcion?
    
    private Lista mi_cadena;        // cadena que contiene atomos
    private String desc;            // descripcion
    private String atomo;           // Atomo
    private String funcion;         // Funcion
    private double num;             // numero
    
    
    public Atoms(){
        this.tipoNulo = true;
        this.tipoCadena = false;
        this.tipoNumero = false;
        this.tipoVariable = false;
        this.tipoFuncion = false;
    }
    
    public Atoms(Lista mi_cadena){
        
        this.tipoCadena = true;
        this.tipoNulo = false;
        this.tipoNumero = false;
        this.tipoVariable = false;
        this.tipoFuncion = false;
        this.mi_cadena = mi_cadena;
    }
    

    
    public Atoms(String atomo){
        try{
            Atoms atomo_num = new Atoms(Integer.parseInt(atomo));
            this.copyAtom(atomo_num);
            this.num = Double.parseDouble(atomo);
            this.tipoNumero = true;
        } catch(NumberFormatException noInt){
            try{
                Atoms atomo_num = new Atoms(Double.parseDouble(atomo));
                this.copyAtom(atomo_num);
                this.tipoNumero = true;
                this.num = Double.parseDouble(atomo);
            }catch(NumberFormatException noDob){
                this.atomo = atomo;
                this.tipoNumero = false;
                this.tipoNulo =  false;
                this.tipoCadena= false;
            }
        }
    }
    
    public Atoms(String atomo, String desc){
        this.atomo = atomo;
        this.desc = desc;
        
    }    
    public Atoms(int num){
        this.num = num;
        this.tipoNumero = true;
        this.tipoCadena = false;
        this.tipoNulo = false;
        this.tipoVariable = false;
        this.tipoFuncion = false;
        this.atomo = Integer.toString(num);
    }
    
    public Atoms(double num){
        this.num = num;
        this.tipoNumero = true;
        this.tipoCadena = false;
        this.tipoNulo = false;
        this.tipoVariable = false;
        this.tipoFuncion = false;
        this.atomo = Double.toString(num);
    }


    
    
    
    public void setTipoCadena(boolean tipoCadena){
        this.tipoCadena = tipoCadena; 
    }
    
    public void setTipoNumero(boolean tipoNumero){
        this.tipoNumero = tipoNumero;
    }
    
    public void setTipoNulo(boolean tipoNulo){
        this.tipoNulo = tipoNulo;
    }
    public void setTipoVariable(boolean tipoVariable){
        this.tipoVariable = tipoVariable;
    }
    public void setTipoFuncion(boolean tipoFuncion){
        this.tipoFuncion = tipoFuncion;
    }
    
    public boolean getTipoCadena(){
        return this.tipoCadena;
    }
    public boolean getTipoNumero(){
        return this.tipoNumero;
    }
    public boolean getNulo(){
        return this.tipoNulo;
    }
    public boolean getTipoVariable(){
        return this.tipoVariable;
    }
    public boolean getTipoFuncion(){
        return this.tipoFuncion;
    }
    
    public double getNum(){
        if(!this.tipoNumero){
            System.out.println("No es un numero :S");
        }
        return this.num;
    } 
    
    public void copyAtom(Atoms atomo){
        this.tipoCadena = atomo.tipoCadena;
        this.tipoNumero = atomo.tipoNumero;
        this.tipoNulo = atomo.tipoNulo;
        this.tipoVariable = atomo.tipoVariable;
        this.tipoFuncion = atomo.tipoFuncion;
    }
    
    public String toString(){
        String descripcion = "";
        if(this.tipoNulo){
            descripcion += "NIL";
        }
        if(this.getTipoCadena()){
            descripcion += this.mi_cadena.toString();
        }
        if (this.getTipoNumero()){
            descripcion += this.getNum();
        }
        else{
            descripcion += this.atomo;
        }
        return descripcion;
    }
    
    public boolean equals(Object ob){
        Atoms mi_atomo = (Atoms)ob;
        boolean ans;
        if((this.tipoNulo) && (mi_atomo.tipoNulo)){
            ans = true;
            return ans;
        }
        if((this.tipoNumero)&&(mi_atomo.tipoNumero)){
            ans = this.num == mi_atomo.num;
            return ans;
        }
        if((this.tipoCadena)&&(mi_atomo.tipoCadena)){
            ans = this.mi_cadena.equals(mi_atomo.mi_cadena);
            return ans;
        }
        ans = this.atomo.compareTo(mi_atomo.atomo)==0;
        return ans;
    }
    
    public boolean Operar(){
        boolean operando;
        if(this.getTipoCadena()){
            operando = this.mi_cadena.Operation;
            return operando;
        }
        return false; 
    }
    
    public boolean Entero(){
        if(!this.tipoNumero){
            return false;
        }
        
        try{
            int numero = Integer.parseInt(this.atomo);
            return true;
        }catch (NumberFormatException noInt){
            return false;
        }
    }
    
    public String getTipoAtomo(){
        if(this.tipoCadena)
            return "CONS";
        if(this.tipoNumero)
            return "Single-Double";
        if(this.tipoNulo)
            return "NULL";        
        else
            return "SYMBOL";
    }
}

